共计 1601 个字符,预计需要花费 5 分钟才能阅读完成。
原理
1 setuid
范围:文件或目录
前提:仅限可执行的二进制文件程序才能设定 SUID 权限。
必要:命令执行者要对该程序有执行权限。
晋升:命令执行者再执行该程序时,用户身份晋升为该程序文件的 Owner 用户。
2 setgid
范围:仅适用于文件
前提:仅限可执行的二进制程序才能设定 SGID 权限。
必要:命令执行者要对该程序拥有执行权限。
晋升:命令执行者再执行该程序时,组身份晋升为该程序文件的 Owner 组。
3 stickyBIT
范围:仅适用于目录
必要:普通用户对目录拥有写入和执行权限。
影响:当目录设置为 stickyBIT 后,该目录下的文件只有 Owner 用户才可以删除,其他即使拥有写入权限也无法删除(root 用户除外)
应用
1 setuid setgid 使用场景
场景 1:
普通用户可以以 root 角色运行只有 root 才能执行的程序或命令。比如我们熟知的 passwd 命令,普通用户可以使用该命令修改自己的密码。这是为什么呢?看下 passwd 命令的权限就知道答案了,如下图:
/usr/bin/passwd
文件已经设置 setuid 权限位(-rwsr-xr-x)
,所以,普通用户临时可以晋升为 root 用户执行该命令来达到修改自己密码的目的。
为了完成 root 才可以执行的命令,我们为普通用户提升权限,一般常用的办法是 su 或 sudo。虽然 setuid 和 setgid 能帮我们提权,但是,这两个命令存在很大的隐患,因此尽可能少用。
场景 2:
我们现在希望在普通用户 dev 提权为 root 删除 Owner 为 root 的 /apple.txt 文件。使用 root 用户创建 /apple.txt 文件,如下图所示:
然后切换 dev 用户,执行 rm -rf apple.txt
提示权限不足。如下图:
我们使用 root 用户对 rm 文件 setuid 进行提权,如下图所示:
然后切换 dev 用户,对 /apple.txt 成功进行了删除。如下图所示:
通过上面的例子,我们知晓了如何使用 setuid 使得普通用户提权超越用户自身的权限的能力。同理,setgid 使用的方法,在这里不再举例子了。
2 stickyBIT 使用场景
现在有这样一个需求,在 /tmp 目录下任何人都可以修改、创建、删除文件,期望用户 A 创建的文件不希望用户 B 删除,此时,可以对 /tmp 目录设置粘滞位,就可以实现上述功能。如下图所示对 /tmp 目录设置粘滞位:
然后,使用 dev 用户创建 /tmp/apple 文件夹和 /tmp/apple.txt 文件,使用 bu 用户删除提示被禁止,如下图:
使用语法
chmod 命令中的特殊权限位含义,下面都是 8 进制数:
S_ISUID 04000 文件的 (set user-id on execution)位
S_ISGID 02000 文件的 (set group-id on execution)位
S_ISVTX 01000 文件的 sticky 位
如何设置 UID、GID、STICK_BIT,如下说明:
SUID:置于 u 的 x 位,原位置有执行权限,就置为 s,没有了为 S。chmod u+s file/dir #设置 setuid 权限,针对文件或目录
chmod 4551 file/dir #权限:r-sr-x—x
SGID:置于 g 的 x 位,原位置有执行权限,就置为 s,没有了为 S .
chmod g+s file #设置 setgid 权限, 针对文件
chmod 2551 file #权限:r-xr-s--x
STICKY:粘滞位,置于 o 的 x 位,原位置有执行权限,就置为 t,否则为 T .
chmod o+t dir #设置 stick bit 权限,针对目录
chmod 1551 dir #权限:r-xr-x--t
注意:特殊权限只对可执行权限的文件或文件夹有效,没有执行权限的文件或文件夹被设置成特殊限位时没有意义。
没有可执行权限的文件或文件夹被设置成特殊权限位的标志如下:SUID---S(大写)--- 不可用状态
SGID---S(大写)--- 不可用状态
SBIT----T(大写)--- 不可用状态